using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
using 凌依.工具库.U2D地图;
using 凌依.工具库.U3D空间计算;

public class 测试寻路算法 : MonoBehaviour
{
    public Tilemap 障碍物层;
    public Tilemap 寻路层;

    public Vector2Int 地图宽高;
    public Vector2Int A点;
    public Vector2Int B点;
    [Range(0,100)]
    public int 生成障碍物几率;
    public Sprite 图片;
    private System.Random r = new System.Random();
    private Tile 红色瓦片;
    private Tile 蓝色瓦片;
    private Tile 绿色瓦片;
    List<Vector2Int> 障碍物 = new List<Vector2Int>();

    [ContextMenu("初始化")]
    void 初始化()
    {
        foreach (var item in 障碍物)
        {
            障碍物层.SetTile(item.ToVector3Int(), null);
        }
        障碍物.Clear();
        List<Vector2Int> 地图 = new List<Vector2Int>();//1,0 4,3
        List<Vector2Int> fjian = new List<Vector2Int>() {
            new Vector2Int(1,3),
            new Vector2Int(1,2),
            new Vector2Int(1,1),
            new Vector2Int(1,0),
            new Vector2Int(2,0),
            new Vector2Int(3,0),
            new Vector2Int(4,0),
            new Vector2Int(4,1),
            new Vector2Int(4,2),
            new Vector2Int(4,3),
            new Vector2Int(3,3),
            new Vector2Int(2,3),
        };

        寻路管理器_A星.获取实例.初始化地图信息_后台(地图宽高, Vector2Int.zero, a =>
        {
            if (fjian.Contains(a))
            {
                if (a == Vector2Int.one)
                {
                    障碍物.Add(a);
                    return 节点类型_A星.门;
                }
                障碍物.Add(a);
                return 节点类型_A星.绝对障碍;
            }
            地图.Add(a);
            //if (r.Next(100) < 生成障碍物几率)
            //{
            //    障碍物.Add(a);
            //    return 节点类型_A星.绝对障碍;
            //}
            return 节点类型_A星.地面;
        },()=> {
            foreach (var item in 地图)
            {
                障碍物层.SetTile(item.ToVector3Int(), 蓝色瓦片);
            }
            foreach (var item in 障碍物)
            {
                障碍物层.SetTile(item.ToVector3Int(), 红色瓦片);
            }

            寻路管理器_A星.获取实例.计算房间_后台(() => Debug.Log("房间生成完成"));
        });
    }
    List<Vector2Int> 上次路径 = new List<Vector2Int>();
    [ContextMenu("寻路")]
    void 寻路()
    {

        foreach (var item in 上次路径)
        {
            寻路层.SetTile(item.ToVector3Int(), null);
        }
        上次路径.Clear();
        long 开始时间 = 凌依.工具库.时间.时间戳_毫秒级();
        Debug.Log("开始寻路");
        寻路管理器_A星.获取实例.寻路_后台(A点, B点, new 节点类型_A星[1] { 节点类型_A星.绝对障碍 }, a =>
        {
            Debug.Log($"寻路用时:{凌依.工具库.时间.时间戳_毫秒级()-开始时间}ms");
            foreach (var item in a)
            {
                寻路层.SetTile(item.坐标.ToVector3Int(), 绿色瓦片);
                上次路径.Add(item.坐标);
            }
        });
    }
    void Start()
    {
        红色瓦片 = 瓦片地图.创建_瓦片(图片, Color.red);
        蓝色瓦片 = 瓦片地图.创建_瓦片(图片, Color.blue);
        绿色瓦片 = 瓦片地图.创建_瓦片(图片, Color.green);
        障碍物层.SetTile(Vector3Int.zero, 瓦片地图.创建_瓦片(图片, Color.yellow));
    }

    private Vector2Int 坐标()
    {
        Vector3 vector3 = 触控.获取_鼠标世界坐标();
        if (vector3.x < 0)
            vector3.x -= 1;
        if (vector3.y < 0)
            vector3.y -= 1;
        Vector2 vector2 = vector3.ToVector2();
        Vector2Int a = vector2.ToVector2Int();
        return a;
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            B点 = 坐标();
            寻路();
        }
        if(Input.GetMouseButtonDown(1)){
            //设置障碍物
            Vector2Int 坐标 = this.坐标();
            障碍物.Add(坐标);
            寻路管理器_A星.获取实例.设置节点类型(坐标, 节点类型_A星.绝对障碍);
            障碍物层.SetTile(坐标.ToVector3Int(), 红色瓦片);
        }
        if (Input.GetMouseButtonDown(2))
        {
            //清除障碍物
            Vector2Int 坐标 = this.坐标();
            障碍物.Remove(坐标);
            寻路管理器_A星.获取实例.设置节点类型(坐标, 节点类型_A星.地面);
            障碍物层.SetTile(坐标.ToVector3Int(), 蓝色瓦片);
        }
    }
}
